package com.atguigu.spring.aop.proxy.dynamic;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * @author wk
 * @create 2021-06-03 16:06
 */
public class DynamicProxy {
    private Object object;

    public DynamicProxy(Object object) {
        this.object = object;
    }
    public Object getProxy(){
        // 通过Proxy类 的newProxyInstance()方法获取代理对象
        // 三个参数
        // 第一个获取一个类的加载器
        // 1.提供一个类加载器加载动态生成的动态代理类
        ClassLoader classLoader = DynamicProxy.class.getClassLoader();
        // 第二个所实现的接口的class对象
        // 2.获取目标对象所实现的所有的接口的class对象
        Class<?>[] interfaces = object.getClass().getInterfaces();
        // 动态代理类和目标对象实现了相同的接口，因此动态代理类就需要重写接口中所有的抽象方法
        // InvocationHandler决定了动态代理类实现这些方法时的实现过程
        // 3.InvocationHandler
        InvocationHandler invocationHandler=new InvocationHandler() {
            //设置代理类中方法的实现过程
            //proxy：代理对象    method：代理类中的每个方法    args：方法的参数
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
                System.out.println("Logger-->方法名"+method.getName()+",参数"+ Arrays.toString(args));
                Object result=null;
                try {
                    result= method.invoke(object, args);
                    System.out.println("Logger-->方法名"+method.getName()+",返回结果"+result);
                } catch (Exception e) {
                    e.getMessage();
                    System.out.println("Logger-->方法名"+method.getName()+",异常"+e);
                } finally {
                    System.out.println("Logger-->方法名"+method.getName()+",运行结束");
                }
                return result;
            }
        };
        return Proxy.newProxyInstance(classLoader,interfaces,invocationHandler);
    }
}
